#ifndef __QTFS_UDS_EVENT_H__
#define __QTFS_UDS_EVENT_H__

#define UDS_EVENT_BUFLEN 	4096
#define UDS_PATH_MAX		1024

enum EVENT_RETCODE {
	EVENT_OK = 0,
	EVENT_ERR = -1,
	EVENT_DEL = -2, // del this event after return
};

enum TCP2TCP_TYPE {
	MSG_NORMAL = 0,		// 普通消息，当buf对待，直接转发
	MSG_SCM_RIGHTS,
	MSG_SCM_CREDENTIALS,	// unix domain 扩展消息，预留
	MSG_SCM_SECURITY,	// unix domain 扩展消息，预留
	MSG_GET_TARGET,		// 控制消息，用于获取对端的target fd
	MSG_SCM_PIPE,		// 使用SCM传递了一个pipe
	MSG_END,		// tcp消息的结束体
};

enum TCPCNTL_TYPE {
	MSGCNTL_UDS = 1,	// uds代理模式
	MSGCNTL_PIPE,		// pipe匿名管道代理模式
};

// 因为要区分SCM_RIGHTS和普通消息，TCP到TCP需要有一个协议头
struct uds_tcp2tcp {
	int msgtype;
	int msglen;	// len of data
	char data[0];
};

struct uds_msg_scmrights {
	int flags;	// open flags
	char path[UDS_PATH_MAX];
};

enum {
	SCM_PIPE_READ = 0,
	SCM_PIPE_WRITE,
	SCM_PIPE_NUM,
};

struct uds_stru_scm_pipe {
	int dir;	// 0: send read filedes; 1: send write filedes
	// proxy通过scm rights接收到员pipe fd，后面消息回来时事件
	// 会发生变化，所以需要回消息时带上，才能建立关联
	int srcfd;
};

int uds_event_uds_listener(void *arg, int epfd, struct uds_event_global_var *p_event_var);
int uds_event_tcp_listener(void *arg, int epfd, struct uds_event_global_var *p_event_var);
int uds_event_diag_info(void *arg, int epfd, struct uds_event_global_var *p_event_var);
int uds_event_debug_level(void *arg, int epfd, struct uds_event_global_var *p_event_var);
int uds_event_pre_handler(struct uds_event *evt);
int uds_event_pre_hook(struct uds_event_global_var *p_event_var);
int uds_event_post_hook(struct uds_event_global_var *p_event_var);
int uds_event_module_init(struct uds_event_global_var *p_event_var);
void uds_event_module_fini(struct uds_event_global_var *p);

#endif

